home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Celestin Apprentice 5
/
Apprentice-Release5.iso
/
Source Code
/
Libraries
/
3D Class Library
/
LinkList.h
< prev
next >
Wrap
Text File
|
1996-06-27
|
4KB
|
184 lines
// =======================================================================
// 3D Class Library, © Xilex Group
// - ------------------------------------------------------------------- -
// Written by Dmitry Boldyrev/Kirill Medvinsky
// =======================================================================
#pragma once
#include "types.h"
class ListNode
{
public:
/* .. */
protected:
ListNode* mNextNode;
ListNode* mPrevNode;
};
class LinkList
{
friend class ListNode;
public:
inline LinkList()
{ ForgetNodes(); }
inline ~LinkList()
{ FreeNodes(); }
inline void FreeNodes(void)
{
ListNode* nextNode;
mCurrNode = mHead;
while (mCurrNode)
{
nextNode = mCurrNode->mNextNode;
delete mCurrNode;
mCurrNode = nextNode;
}
ForgetNodes();
}
inline void ForgetNodes(void)
{
mNumNodes = 0;
mHead = NULL;
mTail = NULL;
mCurrNode = NULL;
}
inline ListNode* AppendNode(ListNode* inNode)
{
inNode->mPrevNode = mTail;
inNode->mNextNode = NULL;
if (mTail == NULL) {
mHead = inNode;
} else {
mTail->mNextNode = inNode;
}
mTail = inNode;
mCurrNode = inNode;
mNumNodes++;
return inNode;
}
inline ListNode* InsertNode(ListNode* beforeNode, ListNode* inNode)
{
inNode->mPrevNode = beforeNode->mPrevNode;
inNode->mNextNode = beforeNode;
beforeNode->mPrevNode = inNode;
if (beforeNode == mHead) {
mHead = inNode;
} else {
inNode->mPrevNode->mNextNode = inNode;
}
mCurrNode = inNode;
mNumNodes++;
return inNode;
}
inline ListNode* RemoveNode(ListNode* inNode, BOOL doDisposeIt)
{
if (inNode == mTail) {
mTail = inNode->mPrevNode;
}
if (inNode == mHead) {
mHead = inNode->mNextNode;
}
if(inNode->mPrevNode) {
inNode->mPrevNode->mNextNode = inNode->mNextNode;
}
if (inNode->mNextNode) {
inNode->mNextNode->mPrevNode = inNode->mPrevNode;
}
if (doDisposeIt) {
delete inNode;
inNode = NULL;
}
mNumNodes--;
return inNode;
}
inline void GoToFirstNode(void)
{ mCurrNode = mHead; }
inline void GoToLastNode(void)
{ mCurrNode = mTail; }
inline ListNode* GetNextNode(void)
{
ListNode* nextNode;
nextNode = mCurrNode;
if (mCurrNode) {
mCurrNode = mCurrNode->mNextNode;
}
return nextNode;
}
inline ListNode* GetPrevNode(void)
{
ListNode* prevNode;
prevNode = mCurrNode;
if (mCurrNode) {
mCurrNode = mCurrNode->mPrevNode;
}
return prevNode;
}
inline ListNode* GetLastNode(void)
{ return mTail; }
inline ListNode* GetFirstNode(void)
{ return mHead; }
inline WORD NumNodes(void)
{ return mNumNodes; }
inline BOOL IsEmpty(void)
{ return mNumNodes <= 0; }
inline BOOL IsMyNode(ListNode* inNode)
{
mCurrNode = mHead;
while (mCurrNode)
{
if (inNode == mCurrNode)
return TRUE;
mCurrNode = mCurrNode->mNextNode;
}
return FALSE;
}
protected:
ListNode* mHead;
ListNode* mTail;
ListNode* mCurrNode;
WORD mNumNodes;
};
class Stack
{
public:
inline void push(ListNode *data)
{ stack.AppendNode(data); }
inline ListNode *pop()
{ return stack.RemoveNode(stack.GetLastNode(), FALSE); }
inline BOOL empty()
{ return stack.IsEmpty(); }
protected:
LinkList stack;
};